<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 多层对象或数组如何深拷贝？
        // 深拷贝函数
        function deepCopy(obj1) {
            // ES5精准判断数据类型
            var obj = Object.prototype.toString.call(obj1) === '[object Array]' ? [] : {} ;
            for (var key in obj1) {
                // for in 循环，会处理原型链的属性和方法
                //判断循环出来的属性是否是自身属性 ，不需要处理原型及原型链上的属性和方法
                if (obj1.hasOwnProperty(key)) {
                    // 在这里判断数据类型。基本数据类型直接赋值，引用数据类型再次递归，深拷贝
                    if (typeof obj1[key] === 'object') {
                        obj[key] = deepCopy(obj1[key]);
                    } else {
                        obj[key] = obj1[key];
                    }
                }
            }
            return obj;
        }
        Object.prototype.height = '178cm';
        var obj3 = {
            name: '王俊凯',
            age: 18,
            hoppy: {
                name1: '篮球',
                name2: '足球'
            }
        }
        var obj4 = deepCopy(obj3);
        console.log(obj4);
        obj4.hoppy.name1 = '羽毛球';
        console.log(obj3);
    </script>
</body>
</html>